package com.zcxx.generator;

/**
 * @Author WangShuai
 * @Date 2025/3/7 20:12
 * @Version 1.0
 * @Description $
 */

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Component
public class CodeGenerator {

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    public void generateCode() {
        // 创建 MyBatis-Plus 代码生成器实例
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir"); // 获取当前项目的根路径
        gc.setOutputDir(projectPath + "/src/main/java"); // 设置生成的代码输出路径，通常为项目的 src/main/java 目录
        gc.setAuthor("WangShuai"); // 设置代码的作者信息，生成的文件中会包含该信息
        gc.setOpen(false); // 生成完成后是否打开输出目录，false 表示不打开
        gc.setFileOverride(true); // 是否覆盖已有文件，true 表示覆盖
        gc.setSwagger2(true); // 是否生成 Swagger2 注解，true 表示生成
        gc.setBaseResultMap(false); // 是否生成 BaseResultMap（MyBatis 的 ResultMap 配置），true 表示生成
        gc.setBaseColumnList(false); // 是否生成 BaseColumnList（SQL 片段），true 表示生成
        mpg.setGlobalConfig(gc); // 将全局配置设置到代码生成器中

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(url); // 设置数据库连接 URL
        dsc.setDriverName("com.mysql.cj.jdbc.Driver"); // 设置数据库驱动类名，MySQL 8.x 使用 com.mysql.cj.jdbc.Driver
        dsc.setUsername(username); // 设置数据库用户名
        dsc.setPassword(password); // 设置数据库密码
        mpg.setDataSource(dsc); // 将数据源配置设置到代码生成器中

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.zcxx"); // 设置父包名，生成的代码会放在该包下
        pc.setEntity("model"); // 设置实体类所在的包名
        pc.setMapper("mapper"); // 设置 Mapper 接口所在的包名
        //pc.setService("service"); // 设置 Service 接口和实现类所在的包名
        //pc.setController("controller"); // 设置 Controller 类所在的包名
        mpg.setPackageInfo(pc); // 将包配置设置到代码生成器中

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel); // 设置表名映射规则：下划线转驼峰命名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel); // 设置字段名映射规则：下划线转驼峰命名
        strategy.setEntityLombokModel(true); // 是否使用 Lombok 注解，true 表示生成 Lombok 注解（如 @Data）
        //strategy.setRestControllerStyle(true); // 是否生成 RestController 风格的 Controller 类，true 表示生成
        strategy.setInclude("sys_menu", "sys_role","sys_role_menu","sys_user","sys_user_role"); // 设置需要生成的表名，可以传入多个表名
        strategy.setTablePrefix(); // 设置表名前缀，生成实体类时会去掉前缀
        mpg.setStrategy(strategy); // 将策略配置设置到代码生成器中

        // 执行代码生成
        mpg.execute(); // 执行代码生成器，根据配置生成代码
    }
}